#pragma once

#include <string>
#include <vector>
#include <stdint.h>
#include <functional>

namespace El {
namespace Upgrade {

struct FlashInfo {
    size_t size;      // Flash总大小
    size_t eraseSize; // 擦除块大小
    size_t writeSize; // 写入单元大小
    size_t oobSize;   // OOB大小
};

class FlashManager {
public:
    FlashManager();
    ~FlashManager();

    /**
     * @brief 打开Flash设备
     * @param partition Flash分区路径
     * @return 是否成功
     */
    bool Open(const std::string &partition);

    /**
     * @brief 关闭Flash设备
     */
    void Close();

    /**
     * @brief 获取Flash信息
     * @return Flash信息结构体
     */
    FlashInfo GetInfo() const;

    /**
     * @brief 写入数据到Flash
     * @param data 数据指针
     * @param length 数据长度
     * @param offset 写入偏移
     * @param progressCallback 进度回调函数
     * @return 是否成功
     */
    bool Write(const uint8_t *data,
               size_t length,
               size_t offset = 0,
               std::function<void(int)> progressCallback = nullptr);

    /**
     * @brief 读取Flash数据
     * @param data 数据缓冲区
     * @param length 读取长度
     * @param offset 读取偏移
     * @return 实际读取的字节数
     */
    ssize_t Read(uint8_t *data, size_t length, size_t offset = 0);

    /**
     * @brief 检查是否为坏块
     * @param blockOffset 块偏移
     * @return 是否为坏块
     */
    bool IsBadBlock(size_t blockOffset);

    /**
     * @brief 擦除Flash块
     * @param blockOffset 块偏移
     * @return 是否成功
     */
    bool EraseBlock(size_t blockOffset);

private:
    int fd_;
    FlashInfo info_;
    bool isOpen_;
};

} // namespace Upgrade
} // namespace El